/**
 * Created by WuHao on 2017/1/31.
 * 应用程序启动的入口文件.相当于java的main()方法
 */

/**
 * 加载模块
 */
var express = require('express');
var swig = require('swig');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var cookies = require('cookies');

// 加载业务模块
var user = require('./models/user');

// 创建app应用, 相当于调用了NodeJS中的 Http.createServer();
var app = express();

// bodyParser设置
app.use(bodyParser.urlencoded({ extended: true}));

// 设置静态文件托管, 当用户访问的url以/public开始，那么直接返回对应的__dirname + '/public'下的文件
app.use('/public/css', express.static(__dirname + '/public/css'));
app.use('/public/js', express.static(__dirname + '/public/js'));
app.use('/public/images', express.static(__dirname + '/public/images'));
app.use('/public/fontAwesome', express.static(__dirname + '/public/fontAwesome'));

// cookie设置,放在静态托管之后，可以减少请求
app.use(function(req, res, next){
    req.cookie = new cookies(req, res);

    // 解析登陆的cookie信息
    req.userInfo = {};
    if(req.cookie.get('userInfo')){
        try{
            req.userInfo = JSON.parse(req.cookie.get('userInfo'));

            // 初始化的时候,根据ID,查询到是否是管理员，并且把标识给到request中的userInfo对象中。
            user.findById(req.userInfo._id).then(function(userInfo){
                req.userInfo.isAdmin = Boolean(userInfo.isAdmin);
                next();
            });

        }catch(e){
            console.log('parse userInfo error' , req.cookie.get('userInfo'));
            next();
        }
    } else {
        next();
    }

});

// 配置应用模板
// 定义当前应用所使用的目标引擎,
// {args1} : 目标引擎名称，也是文件后缀名
// {args2} : 解析模板内容的方法
// app.engine('html', swig.renderFile);
app.engine('html', swig.renderFile);



// 设置模板文件存放的目录
// {args1} : 必须是views
// {args2} : 是目录
app.set('views', './views');

// 注册使用的模板引擎
// {args1} : 必须是 view engine
// {args2} : 必须和app.engine(args1, args2)中的{args1}一致
app.set('view engine', 'html');

// 开发过程中,需要取消目标的缓存
swig.setDefaults({cache: false});

// 绑定路由 V0.1
/*app.get('/', function(req, res, next){
    //res.send('<h1>hello blog</h1>');

    // 读取指定目录(./views/)下的指定文件，并返回给客户端
    // {args1} : 模板的文件, 相对于views目录，即: ./views/index.html
    // {args2} : 传递给模板的数据
    res.render('index.html');
}); */

// 根据不同的功能，划分模块 V0.2
app.use('/admin', require('./routers/admin'));
app.use('/api', require('./routers/api'));
app.use('/', require('./routers/main'));

// 连接mongodb数据库
mongoose.connect('mongodb://localhost:27017/blog', function(err){
    if(err){
        console.log('mongodb连接异常:' + err);
    } else {
        console.log('mongodb连接成功');
        // 监听http请求
        app.listen('8081');
    }
});

